Phase 10 — Localization and Release Preparation
Markers are the ones the other plans use. An unmarked item is
merely planned.
Phase 9 stays open. This arc holds the work that waits on the
English wording settling. That is the other languages, the manuals, and
what a release needs.
- ▶
Every locale says in its own language what the English
says. A locale is its configure.ini strings plus its public and
help wiki pages. Each is rebuilt from en-US where the old one was machine
output. Two scripts were written to find and place the work.
- ⚑
Two scripts find what a locale lacks and place translated
pages. devlog/devscripts/check_locale.sh counts keys missing
or empty, values whose markers differ from English, repeated emoji
names, and wiki pages with no counterpart. It maps a folder tag such
as el_GR to the page tag el-GR and reports a configure.ini that does
not parse. Pages are placed into PublicHelpPages.php by a script kept
outside the repository.
- ⚑
Arabic. All 4,592 strings, 97 help pages and 15
public pages are written new from the English. They replace an older
fill whose pages had broken markup. Code spans in four code-heavy
pages were copied back from the English by script. Three pages use an
Arabic example where the English has a French one.
- ⚑
Bengali. All 4,592 strings are written new from the
English. They replace an older fill with garbled values and shared
emoji names. Now no two emoji share a name. All 97 help pages and 15
public pages are written new too. Code in five code-heavy pages was
copied back from the English by script.
- ⚑
German. All 4,586 strings, 15 public pages and 97
help pages are rewritten. Many old values were Spanish or French
words, and 63 old help pages had names such as Kriechen,_Um. Eighteen
activity names seeded by Createdb.php are rewritten too. An orphan
page on the locale writing mode is removed.
Its Syntax page lost the ballot-by-mail paragraphs in one patch and
is restored from the version before it.
- ⚑
Greek. All 4,586 strings, 15 public pages and 97
help pages are written. The old configure.ini did not parse because of
unescaped quotes, so Yioop read no Greek string. Greek had no wiki page
before. A page name outside ASCII (American Standard Code for
Information Interchange) is percent-encoded twice in page_name.
Its Markdown Syntax page is now written new, code copied by script.
- ⚑
Spanish. All 4,586 strings, 15 public pages and 97
help pages are rewritten. Old values held Portuguese words, and old
pages had names such as Rastreo_De_Pedido. Createdb.php seeded the video
search as Videos and now seeds Vídeos.
Its Markdown Syntax page is now written new, code copied by script.
- ⚑
Farsi. All 4,586 strings, 15 public pages and 97 help
pages are written; Farsi had no wiki page at all before. Old values
held wrong words, such as Falkland Islands for Fiji.
Createdb.php seeded the image and news searches with their last
letter cut off, and now seeds whole words.
Its Markdown Syntax page is now written new, code copied by script.
- ⚑
Hindi. All 4,592 strings, 97 help pages and 4 public
pages.
The 11 older public pages, Syntax among them, are now written new.
- ⚑
Indonesian. All 4,592 strings, 97 help pages and 4
public pages.
The 11 older public pages, Syntax among them, are now written new.
- ⚑
Italian. All 4,592 strings retranslated, 97 help pages
and 4 public pages.
The 11 older public pages, Syntax among them, are now written new.
- ⚑
French. All 4,592 strings, 97 help pages and every
public page. check_locale finds nothing missing, empty or mismatched.
The 11 older public pages, Syntax among them, are now written new.
- ⚑
Hebrew. All 4,592 strings, 97 help pages and every
public page. check_locale finds nothing missing, empty or mismatched.
The 11 older public pages, Syntax among them, are now written new.
- ⚑
Japanese. All 4,592 strings retranslated, 97 help
pages and 4 public pages. Code blocks and DNS record lines are copied
from the English by script, not retyped.
The 11 older public pages, Syntax among them, are now written new.
Six help page names that held a space now use underscores.
- ⚑
Kannada. All 4,592 strings, 97 help pages and 15
public pages are written new from the English. Code in the
code-heavy pages was copied back from the English by script.
- ⚑
Korean. All 4,592 strings, 97 help pages and 15
public pages are written new from the English, over three patches.
Code in the code-heavy pages was copied back from the English by
script, and no emoji name is given twice.
- ⚑
Dutch. All 4,592 strings, 97 help pages and 15
public pages are written new from the English, over three patches.
Nothing is kept from the earlier translation. Code in the
code-heavy pages was copied back from the English by script.
- ⚑
Polish. All 4,592 strings, 97 help pages and 15
public pages are written new from the English, over four patches.
Every old Polish wiki page was deleted first, unread.
- ⚑
Portuguese. All 4,592 strings are written new from the
English, and every old Portuguese wiki page is deleted, unread. All 97
help pages and all 15 public pages are written new, the two syntax
pages with their code copied from the English by script.
- ⚑
Russian. Every old Russian string is blanked and every
old Russian wiki page deleted, unread. All 4,592 strings, 97 help pages
and 15 public pages are written new from the English. The two syntax
pages have their code copied from the English by script.
- ⚑
Telugu. Every old Telugu string is blanked and every
old Telugu wiki page deleted, unread. All 4,592 strings, 97 help pages
and 15 public pages are written new from the English. The two syntax
pages have their code copied from the English by script.
- ⚑
Thai. Every old Thai string is blanked and every old
Thai wiki page deleted, unread. All 4,592 strings, 97 help pages and
15 public pages are written new from the English. The two syntax
pages have their code copied from the English by script.
- ⚑
Tagalog. Every old Tagalog string is blanked and
every old Tagalog wiki page deleted, unread. All 4,592 strings, 97 help
pages and 15 public pages are written new from the English. The two
syntax pages have their code copied from the English by script.
- ⚑
Turkish. Every old Turkish string is blanked and every
old Turkish wiki page deleted, unread. All 4,592 strings, 97 help pages
and 15 public pages are written new from the English. The syntax pages
have their code copied from the English by script.
- ⚑
Vietnamese. Every old Vietnamese string is blanked and
every old Vietnamese wiki page deleted, unread. All 4,592 strings and 63 of
the 97 help pages are written new from the English. The other 34 help
pages and the 15 public pages are written after them. The syntax pages
have their code copied from the English by script.
- ⚑
Chinese. Every old Simplified Chinese string is blanked
and every old Chinese wiki page deleted, unread. All 4,593 strings and
25 of the
97 help pages are written new from the English. The other 72 help pages
and the 15 public pages are written after them. The syntax pages have
their code copied from the English by script.
- ⚑
Running code never writes into src/locale. With no
work-directory locale copy, LOCALE_DIR was the source tree, and every
request's locale upgrade rewrote it.
- ⚑ Config.php now makes the work directory's copy when it is
missing, owned by the run-as user.
- ⚑ The locale upgrade does nothing when LOCALE_DIR is still the
source tree.
- ⚑ Config.php no longer makes the copy. A site without one keeps
LOCALE_DIR as the source tree, which the guard above leaves
unwritten.
- ⚑
The shipped locale version matches the running one.
view_locale_version is 14 in all 25 locales, as RESOURCES_WIKI_VERSION
is, so a site's upgrade no longer runs on every request.
- ⚑
Locale dropdowns. A wiki or Markdown page can draw a
dropdown of the enabled locales with [{locale}], [{locale|names}],
[{locale|flags}] or [{locale|flags-and-names}].
- ⚑ Choosing a locale reloads the page with page_locale, which an
alias redirect now keeps.
- ⚑ Each locale has a FLAG, set in Manage Locales; database version
129 adds it with the usual flag of each shipped locale.
- ⚑ The Syntax help page describes the dropdowns in all 25 locales,
and RESOURCES_WIKI_VERSION is 15 so sites receive it.
- ⚑ A shipped locale with no stored flag shows its default flag, in
Manage Locales and in the dropdowns.
- ⚑ The Edit Locale strings table keeps to its panel: a long string
id breaks, and each field fills its column.
- ⚑ The dropdown names the URL class through window, since in an
inline handler URL finds document.URL, a string.
- ⚑ Each drawn heading gets a section-N anchor for its position. The
dropdown sends a heading fragment as that anchor, so a translation
opens at the same section.
- ⚑
The paused-search page is drawn by a view. Its strings
were called from index.php, so an upgrade's merge dropped them and the
page showed their names. PausedSearchView now draws it.
- ⚑ The four keys are renamed to pausedsearch_view names in all 25
locales, keeping their translations.
- ⚑ After a merge of a work copy, the page reads in English and in
Vietnamese with no key names.
- The mail library calls tl() on nine keys. The merge
drops them, so mail connection errors would show as key names.
- Forty-five keys reach tl() through a variable. The
merge drops them too, such as accountaccess_component_role_purchase.
- ⚑
Upgrading locales can replace pages edited on a site.
ConfigureTool's upgrade-locales command takes overwrite, and its menu has
a matching item. Without it, edited pages are kept.
- ⚑ The help-page check read PUB_DATE, which does not exist, so
edited help pages were always replaced. It now reads PUBDATE.
- ⚑ An edited English Syntax page survives a plain upgrade. The
command with overwrite and the menu item both replace it.
- ⚑
Two strings no longer change or go missing on upgrade.
The account-rename message used escaped double quotes, which the merge
doubled. All 25 locales now use single quotes there.
- ⚑ iconlink_helper_fee_warning is added in all 25 locales. The
helper fills the fee into the translated text.
- ⚑
The French and Spanish stemmers match Snowball, and unused
strings are gone. French matched Snowball's 2007 outputs on
all 20,403 words. Spanish now places RV at a short word's end and
matches on all 28,390. Twenty-four strings no code uses are removed
from all 25 locales.
- Every other locale is audited the same way.
What check_locale.sh finds is written down before translating.
- The manuals match what Yioop does now. The wiki
documentation was last given a full pass for version 9.3 in December
2022. Several source documents describe screens and settings that have
changed since. Each is read against the running program and brought up
to date.
- The five source documents are refreshed. They
are yioop_docs.pdf, Ranking_Mechanisms.pdf, Yioop_Install_Guides.pdf,
Yioop_Wiki_Syntax.pdf and Coding.pdf. Each is read against the screens
it describes.
- The mail deliverability writing is finished.
The standards work shipped in Phase 2, and the Mail Services wiki page
already covers the Banner section and the PTR note. What remains is
bringing the deliverability documents into line with that page.
- What has to be true before a release is true. This
is the last pass over the parts a release exposes. Each item here is
small on its own and easy to forget until an install fails.
- VersionFunctions holds only what version 9 and later
need. The upgrade path from older versions is no longer
supported, and the functions for it make the file hard to read.
- The escaping fault found in the localization audit is
fixed. It is recorded in the master list beside the audit
itself, and is fixed with the audit rather than after it.
- Other work, grouped by what it touched. Each is a
deliverable of its own that came up during the arc. They are grouped by
the part of Yioop they concern rather than listed one by one.
- ⚑
The development process lets a translated wiki page be
written into PublicHelpPages.php. This is allowed late in a
version, once the English pages have stopped changing.
- ⚑
Upgrading locales works on a site reached through
PDO. A model built without a connection now takes its
caller's database settings. PDO refused the empty ones that SQLite
ignored.
- ⚑
The wiki syntax page says how witnesses answer by
mail. Locales from Arabic to Kannada say the same.
- ⚑
The first request after a pull upgrades the locales once, in
seconds. The upgrade takes the database upgrade's lock, and
other requests wait. Its 5,496 page writes go in one transaction, 6.4
seconds where they took 21.1.
- ⚑
Themes live in app/css and each domain links to the one it
uses. A domain's auxiliary.css links to a theme there.
Delete sits beside Save and asks first. Version 136 moves old themes
and links the ones in use. Site images are WebP.
- ⚑
The editor preview draws a picture inside a link.
The browser's wiki parser now counts only a link's own bars, as the
server's parser does.
- ⚑
The front counts a cookieless search before a worker runs
it. Only workers counted, so searches answered 503 while
waiting went uncounted. Searches stayed let through for minutes.
- ⚑
A hot target whose hour is over is one ask short of hot
again. It was dropped, and needed its whole count again.
The searches until then ran in workers and held up the crawl. The
front counting searches is taken out. Its file write holds up the
front on a slow disk.
- ⚑
ConfigureTool and GroupWikiTool move wiki content between
sites, ready for the seekquarry documentation update. The
parts below are grouped here because the documentation will describe
these tools. Each moves pages or threads so the other site shows them
as the first did.
- ⚑
ConfigureTool makes the databases and moves the help pages,
and GroupWikiTool moves any group's pages.
Createdb.php and ExportPublicHelpDb.php are gone.
ConfigureTool now has createdb, export-public-help and
import-public-help, on the command line and in its menu.
The import puts a file's pages into a running site's wiki.
It keeps the users and the other groups.
GroupWikiTool can export a group's pages in the same format, and
import them with type yioop.
WikiPagesFile reads that format as text, so the file is never run.
- ⚑
Exports keep every page, and a locked import is undone with
a plain message. A page with a line starting EOD was left
out of export files. It now gets its own end mark, such as EOD_1.
An import that finds the database in use now rolls back and says
so.
- ⚑
The import can delete the Public and Help pages
first. import-public-help wipe and a menu item delete every
page of both groups, with history, links and discussion. The deletion
is part of the import, so a failed import keeps the old pages.
- ⚑
The configure menu keeps locale and wiki page steps on screens
of their own. The main menu went from 16 items to 12. Locales
and Public and Help Wiki Pages each open a screen with a Return
item.
- ⚑
An export names each page as it is named now. It took
names from page revisions, which keep a page's old name. Issue pages
renamed by version 124 went out as repo$1 and came back as extra
pages.
- ⚑
An export imported on another site makes the same
pages.
Each page keeps its date and its thread's posts, and deleting a
repository page deletes its issue pages. The export writes each page's
revision time and posts beside it, and the import saves them. The Export
screen and export-public-help can leave out git issue pages or posts.
The menu now stops when its input ends rather than asking forever.
- ⚑
An import that deletes first keeps what the export left
out. An export can also leave out page history, and its file
says which kinds it carries. The import then deletes only pages the
file lacks, and only the kinds the file brings back. Issue pages,
comments and history left out of the export stay.
- ⚑
GroupWikiTool exports a group's pages, its discussions, or
both. Pages go with their dates, history, comments and issue
pages, and threads with all their posts. Its import makes them again,
and its description no longer names PublicHelpPages.php.
- ⚑
Importing a group's discussions again adds only what is
new. A thread whose first post has the same time, title and
text is taken as already there. Only replies it lacks are added, so
a second import of the same file adds nothing.
- ⚑
GroupModelTest's docblocks meet the docblock rules.
Each one now opens with the name of what it describes.
- ⚑
A git repository page whose folder is missing still opens,
with its issues. An imported page's resource path can name a
folder the new site lacks. The page, its issues and its settings now
open with the resource path warning, where they answered 500.
- ⚑
An imported Public page links to /p/ pages. The
import and createdb saved pages with no link address, so a header
link read href="Demos". They now use the address the wiki screen
uses, WikiModel::PUBLIC_LINK_BASE.
- ⚑
A page any tool imports links to its own group's
pages. The Public fix left other groups' imported pages
saved with no link address. createdb, both imports, the dokuwiki
import and the help page upgrades now save every page with
WikiModel::WIKI_LINK_BASE, filled in when the page is drawn.
- ⚑
An export can take just the Public or just the Help
group. The Export screen gains a toggle for each group,
and export-public-help takes +/-public and +/-help. A file of one
group declares only that group's array. An import of it, even with
wipe, leaves the other group alone; before, wipe deleted every page
of the group the file lacked. createdb takes that group's pages from
the file Yioop ships.
- ⚑
Discussion badges count only what people wrote, and a group's
feed has a bar to order, filter and search its threads.
The post Yioop writes when a wiki page is made is not on a badge. A
join item is not in a feed's count.
- ⚑
Badges leave out the post Yioop writes for a new wiki
page. The badge counts leave out a post of type
WIKI_GROUP_ITEM that starts its own thread. Comments on that
thread still count.
- ⚑
A group's feed has a new post button, an order chooser, a
filter and a search field. They replace Start New Thread.
The filter lists the threads people started, or all discussions with
wiki page threads. FeedModel::feedListClauses turns the choices into
SQL.
- ⚑
A group's thread count leaves out git issue threads, as its
list does. getGroupItemCount counted them, so the count and
the list differed.
- ⚑
Badges write large counts short, as 12K or 3M.
IconlinkHelper and the unread message count use intToMetric, so a long
count no longer covers its button. intToMetric now writes 999,500 as 1M
rather than 1000K.
- ⚑
createdb writes only the two databases, in about 8 seconds
rather than 47.
- ⚑
No impressions are recorded. Each page, thread and
group createdb made was logged as viewed in log/AnalyticLogs. The
first real view of an item now starts its count.
- ⚑
No profile or DKIM key is written. The mail
settings page still makes the key when it is missing.
- ⚑
Rows go in many to an INSERT.
DatasourceManager::insertRows does this, and WikiModel::addNewPages
adds the Public and Help pages with it. The databases made match
the old ones, but for impressions and password salts.
- ⚑
Mail whose Transport Layer Security (TLS) handshake fails is
not sent in plaintext. STARTTLS is the mail command that
turns on TLS. A server that offered it had switched to TLS, so plaintext on that connection read no reply and the message
bounced. The client now closes the connection and sends nothing. The
failure is temporary, so the message is tried again later. The mail
log gets the handshake's reason. On pollett.org the handshakes failed
because php's file of trusted certificates was missing. SmtpClientTest writes only in the tests
folder, and its case that started a mail worker is removed.
- ⚑
The controls above a group's threads are drawn by the icon
link helper. The start, order, filter and search controls
now use the helper's icons and white boxes, one height for all. The
start control uses the helper's pencil, and the go button its arrow.
The search field fills the rest of the bar. The helper gained sort
order and go icons. The feed of all a user's groups shows the same bar
under its social icons, without the pencil. Its order, filter and
search work as on a group's feed. The bar above the list of groups uses
the same icons and heights. It sits on Feeds and Wikis and on Manage
Groups, below the fixed header. Each bar was measured at 360 and
1000 pixels wide.
- ⚑
The groups bar lines up with the social icon row. On
Feeds and Wikis and on Manage Groups both bars now have the same top
and bottom. So they stand the same distance above the first group.
Measured at 360 and 1000 pixels wide.
- ⚑
Deleting a folder removes the symbolic links in it as
links. A link to a deleted file was skipped. So
used_themes_test could stay in the tests folder. A link to
a folder was followed, and that folder's files were deleted.
deleteFileOrDir now unlinks any link, and traverseDirectory does not
walk into one.
- ⚑
Git issues carry labels. The bug icon opens a menu
with Report issue and, for editors, Manage Labels. That page adds,
renames and deletes a repository's labels. A rename or delete changes
every issue with the label. An editor ticks an issue's labels on its
page. The list has a Labels column and the filter menu a label
entry for each label. On a narrow screen the labels show under the
summary in place of the column.
- ⚑
PERSONAL_GROUP_PREFIX is gone from Config.php. The mail
and messages screens set PERSONAL_SCREEN for the group bar rather than
a made-up subtitle. The clipboard thread title is
FeedModel::CLIPBOARD_TITLE_PREFIX, unchanged, so old threads are still
found. The version 10 migration keeps the old prefix as
OLD_PERSONAL_GROUP_PREFIX.
- ⚑
The git issue constants and label code say plainly what they
name. Each comment opens with its constant's name and gives an
example page name, such as yioop$$12 for issue 12. Waiting issues and
bans are called that, not reports. MAX_HELD_GIT_ISSUES now says the
oldest waiting issue is deleted, as the code does. The issue bar's
search field now shrinks, so the bar fits a 360 pixel screen.
- ⚑
The label list page is hidden and labels are managed like
resources. WikiModel::GIT_ISSUE_PAGE_MARKS lists all four
marks, so the yioop$* page leaves the page list. Manage Labels adds with
the add icon. Each label shows once, as a field with a check mark to
rename and a cross to delete, as a page's resources do.
- ⚑
An issue's labels are a row of tags with an Add Label
list. Each tag has a cross that takes the label off the issue.
Choosing from Add Label puts one on. On Manage Labels a label's field is
14rem wide, and its check mark and cross stay on the same line.
- ⚑
A round is counted once. settle_gold.sh no longer
counts a second time when the same message is settled again within ten
minutes. A settle stopped between applying a patch and committing it no
longer leaves gold unable to take the patch.
- ⚑
The Issues tab cleans what it is sent and writes its markup
plainly. The issue and label fields go through clean(). The
comment upload box is plain markup, not document.write. The load
handlers use listen() from basic.js. Manage Labels has no search
bar.
- ⚑
The Issues tab's scripts run from $data['SCRIPT'].
They ran inline before basic.js loaded, so listen was not defined.
SocialComponent now adds initGitScrollPager and initHeldSelection to
$data['SCRIPT']. On an issue's page the word Labels is the drop-down
that adds a label, and it stays after each one.
- ⚑
Manage Labels searches and sorts like the wiki's page
list. It has a sort list and a search field. A search for a
name no label has offers a link that makes it. The label rows fill
min(34rem, 100%), with the check mark and cross at their end.
- ⚑
Search fields draw the magnifying glass inside them.
Eight searches used an arrow, a Go button or a glass beside the field.
These are the group, thread, resource, page, log, locale string,
contact and issue searches. Each now has the glass inside its border,
as the main search bar does. The unused go icon and five unused
strings are gone.